#ifndef __ILI9341_H__
#define __ILI9341_H__

#include "stm32f10x.h"
#include "fonts.h"

// 由片选引脚决定NOR/SRAM块
#define     FSMC_BANK1_NORSRAMX     FSMC_Bank1_NORSRAM4

/****************************************************************
 *                 ILI9341显示屏8080通讯引脚定义
 ***************************************************************/

/************************ ILI9341控制信号 ***********************/

// 片选信号
#define     ILI9341_CS_CLK          RCC_APB2Periph_GPIOG
#define     ILI9341_CS_PORT         GPIOG
#define     ILI9341_CS_PIN          GPIO_Pin_12

// 数据命令信号
#define     ILI9341_DC_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_DC_PORT         GPIOE
#define     ILI9341_DC_PIN          GPIO_Pin_2

// 写使能
#define     ILI9341_WR_CLK          RCC_APB2Periph_GPIOD
#define     ILI9341_WR_PORT         GPIOD
#define     ILI9341_WR_PIN          GPIO_Pin_5

// 读使能
#define     ILI9341_RD_CLK          RCC_APB2Periph_GPIOD
#define     ILI9341_RD_PORT         GPIOD
#define     ILI9341_RD_PIN          GPIO_Pin_4

// 复位引脚
#define     ILI9341_RST_CLK         RCC_APB2Periph_GPIOG
#define     ILI9341_RST_PORT        GPIOG
#define     ILI9341_RST_PIN         GPIO_Pin_11

// 背光灯控制引脚
#define     ILI9341_BK_CLK          RCC_APB2Periph_GPIOG
#define     ILI9341_BK_PORT         GPIOG
#define     ILI9341_BK_PIN          GPIO_Pin_6

/********************** ILI9341数据信号 ***********************/

#define     ILI9341_D0_CLK          RCC_APB2Periph_GPIOD
#define     ILI9341_D0_PORT         GPIOD
#define     ILI9341_D0_PIN          GPIO_Pin_14

#define     ILI9341_D1_CLK          RCC_APB2Periph_GPIOD
#define     ILI9341_D1_PORT         GPIOD
#define     ILI9341_D1_PIN          GPIO_Pin_15

#define     ILI9341_D2_CLK          RCC_APB2Periph_GPIOD
#define     ILI9341_D2_PORT         GPIOD
#define     ILI9341_D2_PIN          GPIO_Pin_0

#define     ILI9341_D3_CLK          RCC_APB2Periph_GPIOD
#define     ILI9341_D3_PORT         GPIOD
#define     ILI9341_D3_PIN          GPIO_Pin_1

#define     ILI9341_D4_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_D4_PORT         GPIOE
#define     ILI9341_D4_PIN          GPIO_Pin_7

#define     ILI9341_D5_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_D5_PORT         GPIOE
#define     ILI9341_D5_PIN          GPIO_Pin_8

#define     ILI9341_D6_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_D6_PORT         GPIOE
#define     ILI9341_D6_PIN          GPIO_Pin_9

#define     ILI9341_D7_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_D7_PORT         GPIOE
#define     ILI9341_D7_PIN          GPIO_Pin_10

#define     ILI9341_D8_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_D8_PORT         GPIOE
#define     ILI9341_D8_PIN          GPIO_Pin_11

#define     ILI9341_D9_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_D9_PORT         GPIOE
#define     ILI9341_D9_PIN          GPIO_Pin_12

#define     ILI9341_D10_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_D10_PORT         GPIOE
#define     ILI9341_D10_PIN          GPIO_Pin_13

#define     ILI9341_D11_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_D11_PORT         GPIOE
#define     ILI9341_D11_PIN          GPIO_Pin_14

#define     ILI9341_D12_CLK          RCC_APB2Periph_GPIOE
#define     ILI9341_D12_PORT         GPIOE
#define     ILI9341_D12_PIN          GPIO_Pin_15

#define     ILI9341_D13_CLK          RCC_APB2Periph_GPIOD
#define     ILI9341_D13_PORT         GPIOD
#define     ILI9341_D13_PIN          GPIO_Pin_8

#define     ILI9341_D14_CLK          RCC_APB2Periph_GPIOD
#define     ILI9341_D14_PORT         GPIOD
#define     ILI9341_D14_PIN          GPIO_Pin_9

#define     ILI9341_D15_CLK          RCC_APB2Periph_GPIOD
#define     ILI9341_D15_PORT         GPIOD
#define     ILI9341_D15_PIN          GPIO_Pin_10

/********************** ILI9341显示屏的FSMC参数定义 ***********************/
/*************************************************************************
 * 2^26 = 0x400 0000 = 64MB, 每个BANK有4*64MB = 256MB
 * 64MB: FSMC_BANK1_NORSRAM1: 0x6000 0000 ~ 0x63FF FFFF
 * 64MB: FSMC_BANK1_NORSRAM2: 0x6400 0000 ~ 0x67FF FFFF
 * 64MB: FSMC_BANK1_NORSRAM3: 0x6800 0000 ~ 0x6BFF FFFF
 * 64MB: FSMC_BANK1_NORSRAM4: 0x6C00 0000 ~ 0x6FFF FFFF
 * 选择BANK1-NORSRAM4连接TFT，地址范围为0x6C00 0000 ~ 0x6FFF FFFF
 * FSMC_A23接LCD的DC(寄存器/数据选择)脚
 * 寄存器基地址 = 0x6C00 0000
 * RAM基地址 = 0x6C00 0000 = 0x6C00 0000 + 2^23*2 = 0x6C00 0000 + 0X100 0000 = 0X6D00 0000
 * 
 ************************************************************************/
#define     FSMC_ADDR_ILI9341_CMD   ((uint32_t)0x6C000000)  // FSMC_BANK1_NORSRAM用于LCD命令操作的地址
#define     FSMC_ADDR_ILI9341_DATA  ((uint32_t)0x6D000000)  // FSMC_BANK1_NORSRAM用于LCD数据操作的地址

/*************************** ILI9341调试预用 ****************************/

#define     ILI9341_DEBUG() 

/****************** ILI9341显示区域的起始坐标和总行列数 ******************/
#define     ILI9341_DispWindow_X_Star        0   // 起始点的X坐标
#define     ILI9341_DispWindow_Y_Star        0   // 起始点的Y坐标

#define     ILI9341_LESS_PIXEL              240 // 液晶较短方向的长度
#define     ILI9341_MORE_PIXEL              320 // 液晶较长方向的长度

/*********************** 定义ILI9341显示屏常用颜色 *********************/

#define     BACKGROUND      BLACK   
#define     WHITE           0xFFFF  // 白色
#define     BLACK           0X0000  // 黑色
#define     GREY            0XF7DE  // 灰色
#define     BLUE            0X001F  // 蓝色
#define     BLUE2           0X051F  // 浅蓝色
#define     RED             0XF800  // 红色
#define     MAGENTA         0XF81F  // 红紫色
#define     GREEN           0X07E0  // 绿色
#define     CYAN            0X7FFF  // 青色
#define     YELLOW          0XFFE0  // 黄色
#define     BRED            0XF81F
#define     GRED            0XFFE0
#define     GBLUE           0X07FF

/*********************** 定义ILI9341常用命令 *********************/
#define     CMD_SetCoordinateX      0X2A    // 设置X坐标
#define     CMD_SetCoordinateY      0x2B    // 设置Y坐标
#define     CMD_SetPixel            0x2C    // 填充像素

void ILI9341_Rst(void);
void ILI9341_Init(void);
void ILI9341_BackLed_Control(FunctionalState enumState);
void ILI9341_GramScan(uint8_t ucOption);
void ILI9341_OpenWindow(uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeigth);
void ILI9341_SetCursor(uint16_t usX,uint16_t usY);
void ILI9341_SetPointPixel(uint16_t usX, uint16_t usY);
void ILI9341_Clear(uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight);
void ILI9341_DrawLine(uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2);
void ILI9341_DrawRectangle(uint16_t usX_Start, uint16_t usY_Start, uint16_t usWidth, uint16_t usHeight, uint8_t ucFilled);
void ILI9341_DrawCircle(uint16_t usX_Center, uint16_t usY_Center, uint16_t usRadius, uint16_t ucFilled);
void ILI9341_DispChar_EN(uint16_t usX, uint16_t usY, const char cChar);
void ILI9341_DispStringLine_EN(uint16_t line, char *pStr);
void ILI9341_DispString_EN(uint16_t usX, uint16_t usY, char *pStr);
void ILI9341_DispString_EN_YDir(uint16_t usX, uint16_t usY, char *pStr);
void LCD_SetFont(sFont *fonts);
void LCD_SetTextColor(uint16_t TextColor);
void LCD_SetColors(uint16_t TextColor, uint16_t BackColor);
void LCD_ClearLine(uint16_t line);

sFont *LCD_GetFont(void);

extern uint16_t LCD_X_LENGTH;
extern uint16_t LCD_Y_LENGTH;


#endif



